//
// Description: 901. 滑雪
// Created by Loading on 2022/6/4.
//

#include <bits/stdc++.h>

using namespace std;

constexpr int N = 310;

int R, C;
// 高度
int h[N][N];
// dp[i][j] 表示从(i,j)开始，最长滑雪轨迹
int dp[N][N];
// 偏移数组
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};

int dfs(int x, int y) {
    if (dp[x][y] != -1) {
        return dp[x][y];
    }
    // 最小是 1
    dp[x][y] = 1;
    // 四个方向遍历
    for (int i = 0; i < 4; ++i) {
        int a = x + dx[i], b = y + dy[i];
        if (a >= 1 && a <= R && b >= 1 && b <= C && h[a][b] < h[x][y]) {
            // 符合条件，取最大值
            dp[x][y] = max(dp[x][y], dfs(a, b) + 1);
        }
    }

    return dp[x][y];
}

int main() {
    cin >> R >> C;
    for (int i = 1; i <= R; ++i) {
        for (int j = 1; j <= C; ++j) {
            cin >> h[i][j];
        }
    }

    memset(dp, -1, sizeof dp);
    int res = 0;
    for (int i = 1; i <= R; ++i) {
        for (int j = 1; j <= C; ++j) {
            res = max(res, dfs(i, j));
        }
    }

    cout << res << endl;

    return 0;
}